package com.zxl.springcloud.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.zxl.springcloud.entity.Student;
import com.zxl.springcloud.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class StudentConsumerController {


    private static final String URI_PRIFIX="http://localhost:7001";
    // 服务提供者name
    private static final String PRIVDER_NAME="http://studen-privder";

    @Autowired
    private StudentService studentService;

    @Autowired
    private RestTemplate restTemplate;


    @PostMapping("/consumer/student/add")
    public boolean add(@RequestBody  Student student){
//        return restTemplate.postForObject(URI_PRIFIX+"/student/add",student,Boolean.class);
        // 使用feign的方式调用服务
        return studentService.add(student);


    }

    @GetMapping("/consumer/student/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrix_get")
    public Student get(@PathVariable("id") Long id){
        System.out.println("consumer被调用");
        // 使用feign的方式调用服务
        return studentService.get(id);
    }

    /**
     *  熔断: 当 get(id) 发生异常，会调用该方法返回默认的数据;
     *  这种方法不推荐，加强了耦合，新增了多余的方法。建议使用 FallbackFactory的方式.
     * @param id
     * @return
     */
    public Student hystrix_get(@PathVariable("id") Long id){
        return  Student.builder()
                .age(0L)
                .class_no(0)
                .id(0L)
                .name("用户查询失败")
                .gender("查询失败")
                .phone("查询失败")
                .build();
    }


    @GetMapping("/consumer/student/findAll")
    public List<Student> findAll(){
        // 使用 restTemplate的方式获取服务
//        return restTemplate.getForObject(PRIVDER_NAME+"/student/findAll",List.class);

        // 使用feign的方式调用服务
        return studentService.findAll();

    }
}
